HAVING句
DBのテーブルは集約したり、グループ化に切り分けたりすることができます
上記記事内で紹介したGROUP BY句はテーブルをグループ化する方法でしたが、そのグループに対して条件を指定したいと思った時には、HAVING句を使用します
SELECT (列名1), (列名2), (列名3),... FROM (テーブル名) GROUP BY (列名1), (列名2), (列名3),... HAVING (グループの値に対する条件)
テーブル名:shop
SELECT 類,COUNT(*) FROM shop GROUP BY 類 HAVING COUNT(*) = 2;
まずSELECT 類,COUNT(*)で類の数をカウントします 果物2、野菜2、飲み物4
GROUP BY 類で『類』だけを切り取りグループかします
HAVING COUNT(*) = 2;で、COUNTが2のみ指定する と、いう流れになります
集約関数を含む文
HAVING無しの類の列のSUM(合計値)
SELECT 類,SUM(売値) FROM shop GROUP BY 類;
HAVING SUM(売値)>500で500以上を指定しての結果
SELECT 類,SUM(売値) FROM shop GROUP BY 類 HAVING SUM(売値)>500
WHERE句を用いて書いても同じ結果を出すことができますが、この二つの差別化として
HAVING句はグループを視野に入れて条件指定
WHERE句は行に対しての条件指定
このように覚えておくといいと思います(・∀・)
結果の並び替え
SELECT文などでデータ全体の結果を表示させた時、もしIDの列を咥えてた場合はIDの小さい順に結果が表示されてました 実はこの並び順はランダムになっていて、次にもう一回呼び出した時に同じような並びになるとは限りません
では、並び順を確実に決めたい場合はどうするかというと...
ORDER BY句
SELECT (列名1), (列名2), (列名3),... FROM (テーブル名); ORDER BY (並び替え列名1),(並び替え列名2),...
売値を低い順に並び替える場合
SELECT * FROM shop ORDER BY '売値' ASC;
反対に大きい順に並び替えるときは、指定した列名の後にDESCと記述します
また、このようにORDER BY句ではGROUP BY句でできなかった名前の変更もできます
SELECT * '名前' AS name, '類' AS category FROM shop ORDER BY name, category;
なぜかというと、SQL文の処理の順番に秘密があります
FROM→WHERE→GROUP BY→HAVING→SELECT→GROUP BY
大体このように処理されるので、SELECTで適用した内容は、その後に来るGROUP BY句でも適用できる仕組みになっています
GROUP BY句はSELECTよりも前にあるので適用されないことになりますね(・∀・)
集約関数も(COUNT(*)など)も使えます!
複数列の並び替え
先ほど並び替えた⇦のテーブルですが、赤枠内の売値100は仕入れ単価の値も違うので、ここも並び替えたいと思います
SELECT * FROM shop ORDER BY '売値 ' '仕入れ単価';
ASCは省略しましたが、ORDER BY句はこのように複数列名を指定することができます
NULLを含む場合
NULLを含む列名にORDER BY句を指定すると
SELECT * FROM shop ORDER BY '仕入れ単価';
結果は1番上か、末尾にまとめられた表示結果になります